package com.jar.exercise.多线程.synchroniz;

import static com.jar.exercise.多线程.synchroniz.Util.sleep;

/**
 * <div  style="border:2px solid none;margin:20px;padding:15px;font-size:24px;text-align:center;color:aqua;">
 *
 *
 *
 *  </div>
 *
 * @author v_zhangshun01
 * @date 2021/12/7 5:22 下午
 */
public class TestCaseStaticObject {


    /**
     *
     */
    public static void main(String[] args) {
        System.out.println("------------分界线1-----------");

        /*
         * README.md试验 的 002
         *
         * 试验证明是 阻塞的 他们只能同是运行一个方法
         *
         */
        // static - static 各自锁  一个 new Signal1()
        Util.newThread(TestCaseStaticObject::m0);
        Util.newThread(TestCaseStaticObject::m1);

        sleep(6000);
        System.out.println("------------分界线2-----------");

        // static - general; 各自锁  一个 new Signal1()

        Util.newThread(TestCaseStaticObject::m1);
        Util.newThread(() -> new TestCaseStaticObject().m2());

        sleep(6000);
        System.out.println("------------分界线3-----------");

        // general - general; 锁共同的一个 实例
        // 每个实例都是会创建一个 signal1 导致各锁个的 ， 如果加上 static 即可锁
        Util.newThread(() -> new TestCaseStaticObject().m3());
        Util.newThread(() -> new TestCaseStaticObject().m4());

        sleep(6000);
        System.out.println("------------分界线4-----------");

        // general - general; 锁共同的一个 实例

        Util.newThread(() -> new TestCaseStaticObject().m5());
        Util.newThread(() -> new TestCaseStaticObject().m6());

        sleep(6000);
        System.out.println("------------分界线5-----------");

        Util.newThread(() -> new TestCaseStaticObject().m6());
        Util.newThread(TestCaseStaticObject::m7);


    }

    public synchronized static void m0() {

        System.out.println("进入 TestCaseStaticObject m0");

        sleep();

        System.out.println("退出 TestCaseStaticObject m0");

    }

    public static void m1() {

        synchronized (new Signal1()) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }


    public void m2() {

        synchronized (new Signal1()) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }


    final Signal1 signal1 = new Signal1();

    public void m3() {

        synchronized (signal1) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }

    public void m4() {

        synchronized (signal1) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }


    static final Signal1 SIGNAL10 = new Signal1();

    public void m5() {

        synchronized (SIGNAL10) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }

    public void m6() {

        synchronized (SIGNAL10) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }


    public static void m7() {

        synchronized (SIGNAL10) {

            System.out.println("进入 TestCaseStaticObject m1");

            sleep();

            System.out.println("退出 TestCaseStaticObject m1");
        }


    }


}
